<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    

<script>

// 写在函数外部的代码,执行时机不可控,也不能重复执行
// console.log( '程序1' );/ 计算机的函数，是一个固定的一个程序段，或称其为一个子程序，它在可以实现固定运算功能的同时，还带有一个入口和一个出口，所谓的入口，就是函数所带的各个参数，我们可以通过这个入口，把函数的参数值代入子程序，供计算机处理；所谓出口，就是指函数的函数值，在计算机求得之后，由此口带回给调用它的程序。

// 通俗讲,可控制执行并可重复执行的代码块,函数可以有参数和返回值

// console.log( '程序2' );
// console.log( '程序3' );

// 函数的作用:
// 1.可控制执行时机
// 2.可重复执行多次
// 3.函数可以封装某些功能
// 4.函数会形成相对独立的空间(作用域)

// 函数的语法:
// function 函数名(参数){函数体} 声明一个函数
// 函数需要调用才会执行: 函数名();

// 函数声明
function test(){
    console.log( '函数内部的程序' );
}

// 调用函数
// test();
// test();
// test();


// 函数的参数: 形参和实参
// 形参: 形式参数,是函数定义时写的参数,形参个数不固定(0个或多个)
// 实参: 实际参数,函数调用时传的参数,实参个数不固定(0个或多个)
// 通常,实参和形参是一一对应的关系
// 但是,实参和形参个数可以不一致
// 函数有了参数之后,可以提高函数的复用性和灵活性

// 实参和形参一一对应:
function fun1(a,b,c){// a,b,c就是形参
    console.log( a,b,c );// 打印形参
}
// fun1(1,2,3);// 1,2,3就是实参

// 实参和形参个数不一致:
function fun2(a,b){// a,b就是形参
    console.log( a,b );// 打印形参
    // 在函数内部如何接收多余的实参?
    // 函数内部有一个关键字 arguments 实参的副本对象
    // 所有的实参都会被arguments对象接收
    // console.log( arguments );// 是一个类数组对象(伪数组)
    console.log( arguments[0] );// 1
    console.log( arguments[1] );// 2
    console.log( arguments[2] );// 3
    console.log( arguments[3] );// 4
}
fun2(1,2,3,4);// 1,2,3,4就是实参

function fun3(a,b,c,d){// a,b,c,d就是形参
    console.log( a,b );// 打印形参
    // 形参c,d的值是什么? undefined
    console.log( c,d );
}
// fun3(1,2);// 1,2就是实参


// 写一个函数计数两个数的和
function sum(a,b){
    console.log( a+b );
}
// sum(2,5);// 7
// sum(12,15);// 27

</script>
</body>
</html>